package com.ww.exercise.coroutine.easy.q10

import kotlinx.coroutines.*

/**
 * 父协程取消后，所有未完成的子协程都会被立即取消
 * 已完成的子协程不受影响
 */

//父协程启动
//子协程1启动（1秒任务）
//子协程2启动（3秒任务）
//子协程3启动（5秒任务）
//子协程1任务完成（1秒任务在父取消前已完成）
//父协程主动取消
//子协程2任务被取消（3秒任务未完成，被父取消）
//子协程3任务被取消（5秒任务未完成，被父取消）
//程序结束
fun main() = runBlocking {
    // 父协程：启动后2秒后主动取消
    val parentJob = launch(Dispatchers.Default) {
        println("父协程启动")

        // 子协程1：执行1秒任务
        launch {
            try {
                println("子协程1启动（1秒任务）")
                delay(1000)
                println("子协程1任务完成")
            } catch (e: CancellationException) {
                println("子协程1任务被取消")
            }
        }

        // 子协程2：执行3秒任务
        launch {
            try {
                println("子协程2启动（3秒任务）")
                delay(3000)
                println("子协程2任务完成")
            } catch (e: CancellationException) {
                println("子协程2任务被取消")
            }
        }

        launch {
            try {
                println("子协程3启动（5秒任务）")
                delay(5000)
                println("子协程3任务完成")
            } catch (e: CancellationException) {
                println("子协程3任务被取消")
            }
        }

        // 父协程启动后2秒主动取消
        delay(2000)
        println("父协程主动取消")
        cancel() // 取消父协程
    }

    parentJob.join() // 等待父协程完成
    println("程序结束")
}